package cn.akwangl.prototype;

import java.io.Serializable;

/**
 * 作者：阿坤
 * 创建时间：15:28 2019/8/15
 * 功能描述：原型设计模式
 * <p>
 * 概述：
 *      原型设计模式，将规定好的模板进行拷贝，减少使用构造器创建对象造成性能上的浪费
 * <p>
 * 什么情况下使用？
 *      创建多个相同或者相似对象的情况
 * <p>
 * 需要注意的是
 *      通过克隆方法所创建的对象是全新的对象，它们在内存中拥有新的地址，
 *      通常对克隆所产生的对象进行修改对原型对象不会造成任何影响，每一个克隆对象都是相互独立的。
 *      通过不同的方式修改可以得到一系列相似但不完全相同的对象。
 * <p>
 * 需要注意的是
 *      能够实现克隆的Java类必须实现一个标识接口Cloneable，表示这个Java类支持被复制。
 *      如果一个类没有实现这个接口但是调用了clone()方法，Java编译器将抛出一个CloneNotSupportedException异常
 */
public class Prototype implements Cloneable, Serializable {

    private static final long serialVersionUID = 86834525646462189L;


    private String name;

    private String content;

    private Student student;

    public Prototype() {
    }

    public Prototype(String name, String content) {
        this.name = name;
        this.content = content;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public Student getStudent() {
        return student;
    }

    public void setStudent(Student student) {
        this.student = student;
    }

    @Override
    protected Prototype clone() {
        Object obj = null;
        try {
            obj = super.clone();
            return (Prototype) obj;
        } catch (CloneNotSupportedException e) {
            System.out.println("不支持复制！");
            return null;
        }
    }

    @Override
    public String toString() {
        return "Prototype{" +
                "name='" + name + '\'' +
                ", content='" + content + '\'' +
                ", student=" + student +
                '}';
    }
}
